package com.wolfking.converter.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.google.common.collect.Sets;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Base64;
import java.util.Date;
import java.util.Set;
import java.util.stream.Collectors;

@Data
@TableName("sql_define")
public class SqlDefine {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 定义的key
     */
    @TableField("define_key")
    private String defineKey;

    /**
     * 数据源
     */
    @TableField("data_source")
    private String dataSource;

    /**
     * 配置的Base64 SQL
     */
    @TableField("sql_base64")
    private String sqlBase64;

    /**
     * 统计总数的SQL
     */
    @TableField("count_sql_base64")
    private String countSqlBase64;

    /**
     * 参数检验脚本
     */
    @TableField("param_verify")
    private String paramVerify;
    /**
     * 返回转换器
     */
    @TableField(exist = false)
    private String responseConverter;

    /**
     * 下划线转驼峰
     */
    @TableField("under_line_to_camel")
    private Boolean underLineToCamel;

    /**
     * 是否容许空参数查询，页面没有任何参数传入
     */
    @TableField("allow_empty_param_query")
    private Boolean allowEmptyParamQuery;

    /**
     * web页面自动加载查询
     */
    @TableField("auto_web_load")
    private Boolean autoWebLoad;

    /**
     * html页面居中显示
     */
    @TableField("html_center_show")
    private Boolean htmlCenterShow;

    /**
     * 列表隐藏的列，在详情中展示
     */
    @TableField(value = "hide_columns")
    private String hideColumns;

    /**
     * 定义的描述
     */
    @TableField("sql_describe")
    private String sqlDescribe;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 修改时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 版本号
     */
    @Version
    @TableField(value = "version", fill = FieldFill.INSERT)
    private Integer version;


    /**
     * base64解码
     *
     * @return 解码的SQL
     */
    public String getSqlBase64Decode() {
        try {
            return new String(Base64.getDecoder().decode(this.sqlBase64), StandardCharsets.UTF_8);
        } catch (Exception e) {
            return StringUtils.isNotBlank(sqlBase64) ? sqlBase64 : "";
        }
    }

    /**
     * base64解码
     *
     * @return 解码的SQL
     */
    public String getCountSqlBase64Decode() {
        try {
            return new String(Base64.getDecoder().decode(this.countSqlBase64), StandardCharsets.UTF_8);
        } catch (Exception e) {
            return StringUtils.isNotBlank(countSqlBase64) ? countSqlBase64 : "";
        }
    }

    public Set<String> getHideColumSet() {
        if (StringUtils.isNotBlank(hideColumns)) {
            return Arrays.stream(hideColumns.split(",")).collect(Collectors.toSet());
        }
        return Sets.newHashSet();
    }
}
